이하 글은 이짝 업계 초짜의 학습 노트이므로 일부 공상과학이 포함되어 있음을 유의하기 바람.
memcached는 분산 환경에서 이종 언어간에 문제가 좀 있다. 어제 이 문제로 검색을 좀 해보니 스택오버 플로에도 간간히 등장하는 소재다. 어제 반나절 정도 테스트 해 본 결과 경우의 수를 엄청 조합해 보아도 잘 안 됐다.
분산 memcached에서는 해싱 알고리즘에 따라 데이터가 각자의 주인을 찾아서 저장된다. 그런데 이종언어간 memcached 라이브러리들이 해싱을 조금씩 다르게 쓰는 것 같다. 그래서 다음과 같은 현상이 발생한다.
C로 돌아가는 1번 서버에서 저장한 값이 PHP로 돌아가는 2번 서버에서 안 읽힌다. 3번 서버의 자바에서는 읽히고 자바에서 쓴 값이 C에선 안 읽히고 뭐 그런다. 각각의 멤캐시를 뒤져보면 잘 저장되어 있다.
설정 미스로 생각하고 해싱 알고리즘과 분산정책, 라이브러리 종류를 바꿔보았으나 100% 힛트를 만족시키지는 못했다.
그냥 인터페이스 파서 프락시를 짭시다! 하는 와중에 moxi라는 것을 발견했다. moxi는 couchbase에서 제공하는 memcached 프락시다.
하는 일로 봐서는 소스 몇 줄이면 될 것 같은데 빌드도 어렵고 뭐 좀 그렇다. cmake 쓸 줄 모른다고! 바이너리를 받아서 씁시다 -_-; http://www.couchbase.com/kr/downloads-all#moxi-server-2-5
완전한 transparent proxy다. 이 용어가 업계 통용어인지는 모르겠는데 10년도 전에 나에게 네트워크 지식을 전수해주신 이동범 지니네트웤스 소장님의 교육 이후로 나는 이 용어를 즐겨쓴다. 개발자는 moxi 데몬을 memcached 데몬이라고 생각하고 쓰면 된다. moxi를 다중으로 띄워놓는 경우에도 완전히 메쉬한 n:n 관계로 맵핑되므로 fail-over 에도 강하다고 할 수 있다. 더 정확히는 실험해봐야 하겠다.
포트가 다른 memcached n개, moxi n개를 띄워놓고 telnet cli 인터페이스 상에서 정상 set/get이 수행되었다.
이종 언어간에 복수의 moxi를 등록하고 분산 moxi 처리를 할 때 같은 문제가 생길 수 있다. 일단 해 봐야겠다. 결과는 다시 등록 예정!
/opt/moxi/bin/moxi -z 20000=localhost:11211,localhost:11212